import ytdl from 'ytdl-core';
import ffmpeg from 'fluent-ffmpeg';
import ffmpegStatic from 'ffmpeg-static';
import fs from 'fs';
import path from 'path';

// 设置ffmpeg路径
ffmpeg.setFfmpegPath(ffmpegStatic);

/**
 * 从YouTube下载视频
 * @param {string} url - YouTube视频URL
 * @param {string} outputPath - 输出文件路径
 */
async function downloadVideo(url, outputPath) {
  return new Promise((resolve, reject) => {
    const videoStream = ytdl(url, { quality: 'highestvideo' });
    const audioStream = ytdl(url, { quality: 'highestaudio' });

    const tempVideoPath = path.join(__dirname, 'temp_video.mp4');
    const tempAudioPath = path.join(__dirname, 'temp_audio.mp4');

    // 下载视频流
    videoStream
      .pipe(fs.createWriteStream(tempVideoPath))
      .on('finish', () => {
        console.log('视频下载完成');

        // 下载音频流
        audioStream
          .pipe(fs.createWriteStream(tempAudioPath))
          .on('finish', () => {
            console.log('音频下载完成');

            // 使用ffmpeg合并音频和视频
            ffmpeg()
              .input(tempVideoPath)
              .input(tempAudioPath)
              .outputOptions('-c:v copy') // 直接复制视频流
              .outputOptions('-c:a aac') // 重新编码音频流为AAC格式
              .save(outputPath)
              .on('end', () => {
                console.log('视频和音频合并完成');

                // 删除临时文件
                fs.unlinkSync(tempVideoPath);
                fs.unlinkSync(tempAudioPath);

                resolve();
              })
              .on('error', err => {
                reject(err);
              });
          })
          .on('error', err => {
            reject(err);
          });
      })
      .on('error', err => {
        reject(err);
      });
  });
}

// 使用示例
(async () => {
  try {
    const youtubeUrl = 'https://www.youtube.com/watch?v=your_video_id';
    const outputFilePath = path.join(__dirname, 'output.mp4');

    await downloadVideo(youtubeUrl, outputFilePath);
    console.log('视频下载和合并完成');
  } catch (error) {
    console.error('下载或合并过程中出错:', error);
  }
})();
